home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 43 / Amiga Format CD43 (1999)(Future Publishing)(GB)(Track 1 of 2)[!][issue 1999-09].iso / -serious- / archivers / xfd / developer / sources / asm / atom.a < prev    next >
Text File  |  1999-06-14  |  5KB  |  218 lines

  1. *******************************************************
  2. **     XFD external decruncher for ATOM Cruncher     **
  3. **        written by Mr. Larmer / Wanted Team        **
  4. **        fixed by SDI in 1999             **
  5. *******************************************************
  6.  
  7.         INCLUDE    "AINCLUDE:IncDirs.i"
  8.         INCLUDE    "libraries/xfdmaster.i"
  9.         INCLUDE    "lvo.i"
  10.  
  11.         * head function for tests
  12. *        INCLUDE    "xfdExeHead.a"
  13.  
  14. ; xfdForeman structure MUST be first thing in all external decrunchers
  15.  
  16. ForeMan        moveq    #-1,d0        ;security
  17.         rts
  18.         dc.l    XFDF_ID        ;id
  19.         dc.w    1        ;version
  20.         dc.w    0
  21.         dc.l    0,0        ;private
  22.         dc.l    S_ATOM        ;first slave
  23.  
  24. **************************************************
  25.  
  26. ; xfdSlave structure: this one doesn't support data scanning
  27.  
  28. S_ATOM        dc.l    0        ;no more slaves
  29.         dc.w    2        ;version
  30.         dc.w    39        ;master version
  31.         dc.l    N_ATOM        ;name
  32.         dc.w    XFDPFF_DATA|XFDPFF_RECOGLEN|XFDPFF_USERTARGET
  33.         dc.w    0
  34.         dc.l    RB_ATOM        ;recog buffer
  35.         dc.l    DB_ATOM        ;decrunch buffer
  36.         dc.l    0        ;recog segment
  37.         dc.l    0        ;decrunch segment
  38.         dc.w    0,0
  39.         dc.l    12+2
  40.  
  41.         dc.b    "$VER: ATOM 2.1 (15.05.1999)",0
  42. N_ATOM        dc.b    "Atomik (ATOM) Cruncher 3.3",0
  43.         even
  44.  
  45. ;-------------------------------------------------
  46.  
  47. ; Recog buffer function: receives buffer + length in a0/d0
  48.  
  49. RB_ATOM        MOVEQ    #0,D0
  50.         CMP.L    #"ATOM",(A0)
  51.         BNE.B    .Exit
  52.         TST.B    4(A0)
  53.         BNE.B    .Exit
  54.         TST.B    8(A0)
  55.         BNE.B    .Exit
  56.         MOVE.L    4(A0),D0
  57.         MOVE.L    D0,xfdrr_MinTargetLen(A1)
  58.         SUBQ.L    #2,D0
  59.         MOVE.L    D0,xfdrr_FinalTargetLen(A1)
  60.         MOVEQ    #12,D0
  61.         ADD.L    8(A0),D0
  62.         MOVE.L    D0,xfdrr_MinSourceLen(A1)
  63.         MOVEQ    #1,D0
  64. .Exit        RTS
  65.  
  66. ;-------------------------------------------------
  67.  
  68. ; Decrunch buffer function: receives bufferinfo in a0
  69. ; This style requires xfdmaster.library V39
  70. DB_ATOM        MOVEM.L    D2-D7/A2-A6,-(A7)
  71.         MOVEA.L    A0,A5
  72.         MOVE.L    xfdbi_UserTargetBuf(A5),A1
  73.         MOVE.L    xfdbi_SourceBuffer(A5),A0
  74.         BSR.B    D_ATOM
  75.         TST.L    D0
  76.         BNE.B    .Skip
  77.         MOVE.W    #XFDERR_CORRUPTEDDATA,xfdbi_Error(A5)
  78. .Skip        MOVEM.L    (A7)+,D2-D7/A2-A6
  79.         RTS
  80.  
  81. ;-------------------------------------------------
  82.  
  83. D_ATOM        movem.l    D1-D7/A0-A6,-(SP)
  84.         move.l    (A0)+,D0    * skip header
  85.         movea.l    A1,A5
  86.         adda.l    (A0)+,A5
  87.         move.l    (A0)+,D0
  88.         lea    (A0,D0.L),A6
  89.         move.b    -(A6),D7
  90.         bra.w    lbC0000C4
  91.  
  92. lbC00001E:    lea    Data3(PC),A4
  93.         moveq    #1,D6
  94.         bsr.s    Sub
  95.         bra.s    lbC000080
  96. lbC000028:    moveq    #6,D6
  97. lbC00002A:    add.b    D7,D7
  98.         beq.s    lbC000050
  99. lbC00002E:    dbcc    D6,lbC00002A
  100.         bcs.s    lbC00003A
  101.         moveq    #6,D5
  102.         sub.w    D6,D5
  103.         bra.s    lbC00005E
  104. lbC00003A:    moveq    #3,D6
  105.         bsr.s    Sub
  106.         beq.s    lbC000044
  107.         addq.w    #6,D5
  108.         bra.s    lbC00005E
  109. lbC000044:    moveq    #7,D6
  110.         bsr.s    Sub
  111.         beq.s    lbC000056
  112.         add.w    #$15,D5
  113.         bra.s    lbC00005E
  114. lbC000050:    move.b    -(A6),D7
  115.         addx.b    D7,D7
  116.         bra.s    lbC00002E
  117. lbC000056:    moveq    #13,D6
  118.         bsr.s    Sub
  119.         add.w    #$114,D5
  120. lbC00005E:    move.w    D5,-(SP)
  121.         bne.s    lbC00009C
  122.         lea    Data2(PC),A4
  123.         moveq    #2,D6
  124.         bsr.s    Sub
  125.         cmp.w    #5,D5
  126.         blt.s    lbC0000A4
  127.         addq.w    #2,SP
  128.         subq.w    #6,D5
  129.         bgt.s    lbC00001E
  130.         movea.l    A5,A4
  131.         blt.s    lbC00007C
  132.         addq.w    #4,A4
  133. lbC00007C:    moveq    #1,D6
  134.         bsr.s    Sub
  135. lbC000080:    cmp.l    A1,A5        * security
  136.         bls.w    Error
  137.         move.b    (A4,D5.W),-(A5)
  138.         bra.s    lbC0000C4
  139.  
  140. Sub:        clr.w    D5
  141. .Sub1:        add.b    D7,D7
  142.         bne.b    .Sub2
  143.         move.b    -(A6),D7
  144.         addx.b    D7,D7
  145. .Sub2:        addx.w    D5,D5
  146.         dbra    D6,.Sub1
  147.         tst.w    D5
  148.         rts
  149.  
  150. lbC00009C:    lea    Data1(PC),A4
  151.         moveq    #2,D6
  152.         bsr.s    Sub
  153. lbC0000A4:    move.w    D5,D4
  154.         move.b    14(A4,D4.W),D6
  155.         ext.w    D6
  156.         bsr.s    Sub
  157.         add.w    D4,D4
  158.         beq.s    lbC0000B6
  159.         add.w    -2(A4,D4.W),D5
  160. lbC0000B6:    lea    1(A5,D5.W),A4
  161.         move.w    (SP)+,D5
  162.         cmp.l    A1,A5        * security
  163.         bls.b    Error
  164.         move.b    -(A4),-(A5)
  165. lbC0000BE:    cmp.l    A1,A5        * security
  166.         bls.b    Error
  167.         move.b    -(A4),-(A5)
  168.         dbra    D5,lbC0000BE
  169. lbC0000C4:    moveq    #11,D6
  170.         moveq    #11,D5
  171. lbC0000C8:    add.b    D7,D7
  172.         bne.b    lbC0000CC
  173.         move.b    -(A6),D7
  174.         addx.b    D7,D7
  175. lbC0000CC:    dbcc    D6,lbC0000C8
  176.         bcs.s    lbC0000D6
  177.         sub.w    D6,D5
  178.         bra.s    lbC0000F0
  179. lbC0000D6:    moveq    #7,D6
  180.         bsr.s    Sub
  181.         beq.s    lbC0000E2
  182.         addq.w    #8,D5
  183.         addq.w    #3,D5
  184.         bra.s    lbC0000F0
  185. lbC0000E2:    moveq    #2,D6
  186.         bsr.s    Sub
  187.         swap    D5
  188.         moveq    #15,D6
  189.         bsr.b    Sub
  190.         addq.l    #8,D5
  191.         addq.l    #3,D5
  192. lbC0000F0:    subq.w    #1,D5
  193.         bmi.s    lbC000102
  194.         moveq    #1,D6
  195.         swap    D6
  196. lbC0000F8:    cmp.l    A1,A5        * security
  197.         bls.b    Error
  198.         move.b    -(A6),-(A5)
  199.         dbra    D5,lbC0000F8
  200.         sub.l    D6,D5
  201.         bpl.s    lbC0000F8
  202. lbC000102:    cmpa.l    A6,A0
  203. lbC000104:    bne.w    lbC000028
  204.         cmp.b    #$80,D7
  205.         bne.s    lbC000104
  206.  
  207.         MOVEQ    #1,D0
  208.         CMPA.L    A1,A5        * destination pointer ok?
  209.         BEQ.B    Exit
  210. Error        MOVEQ    #0,D0
  211. Exit        MOVEM.L    (A7)+,D1-D7/A0-A6
  212.         RTS
  213.  
  214. Data1:        dc.b    0,$20,0,$60,1,$60,3,$60,7,$60,15,$60,$1F,$60,4,5,7,8,9,10,11,12
  215. Data2:        dc.b    0,$20,0,$60,0,$E0,1,$E0,3,$E0,5,$E0,7,$E0,4,5,6,7,8,8
  216. Data3:        dc.b    $60,$20,$10,8
  217.         END
  218.